#!/usr/bin/env bash

usage() {
	echo "USAGE: $0
	parameters:
	  -s|--spl-dir <SPL_GENERATED_DIR>
	  -i|--isw-handoff <ISW_HANDOFF>
	  -b|--board <BOARD_DIRECTORY>
	optional:
	  -e|--embedded-sdk <ALTERA_EMBEDDED_SDK>"
	echo "EXAMPLE: $0 -i ~/cv_soc_devkit_ghrd/hps_isw_handoff/soc_system_hps_0/ -b arch/arm/boards/altera-socdk -e ~/altera-embedded-sdk/"
	exit 1
}

die() {
	printf '%s\n' "$1" >&2
	exit 1
}

generate=
splroot=
embeddedsw=
handoff=
boardroot=

while :; do
	case $1 in
	-e|--embedded-sdk)
		if [ "$2" ]; then
			generate=1
			splroot="$(mktemp -d)"
			embeddedsw=${2}
			shift
		else
			die 'ERROR: "--embedded-sdk" requires a non-empty option argument.'
		fi
		;;
	-s|--spl-dir)
		if [ "$2" ]; then
			splroot="$2"
			shift
		else
			die 'ERROR: "--spl-dir" requires a non-empty option argument.'
		fi
		;;
	-i|--isw-handoff)
		if [ "$2" ]; then
			handoff="$2"
			shift
		else
			die 'ERROR: "--isw-handoff" requires a non-empty option argument.'
		fi
		;;
	-b|--board)
		if [ "$2" ]; then
			boardroot="$2"
			shift
		else
			die 'ERROR: "--board" requires a non-empty option argument.'
		fi
		;;
	*)
		break
	esac
	shift
done

bareboxsrc=.

cd ${bareboxsrc}

copy_source() {
	local src
	local tgt
	src=$1
	tgt=$2

	echo "Merging source code $src to $tgt"

	cp $src $tgt

	dos2unix $tgt

	echo "	Fixing conditional compilation..."
	unifdef -D HCX_COMPAT_MODE=1 -D ENABLE_INST_ROM_WRITE=1 $tgt -o $tgt

	echo "	Fixing extern/static keywords..."
	# Statify all global variables with missing static keyword
	sed -i 's/^const /static const /g' $tgt
	sed -i 's/^unsigned long sys_mgr_init_table/static unsigned long sys_mgr_init_table/g' $tgt

	echo "	Remove unused defines..."
	sed -i 's/\[CONFIG_HPS_PINMUX_NUM\]/\[\]/g' $tgt

	echo "	Translating altera int types..."
	# Replace altera types
	sed -i 's/alt_u32/uint32_t/g' $tgt
	sed -i 's/alt_u16/uint16_t/g' $tgt
	sed -i 's/alt_16/int16_t/g' $tgt
	sed -i 's/alt_32/int32_t/g' $tgt
	sed -i 's/alt_u8/uint8_t/g' $tgt
	sed -i 's/alt_8/int8_t/g' $tgt
	sed -i 's/#include "alt_types.h"//g' $tgt

	echo "	Fixing include paths..."
	# Fix include pathes
	sed -i 's/#include <iocsr_config_cyclone5.h>/#include <mach\/socfpga\/cyclone5-scan-manager.h>/g' $tgt
	sed -i 's/#include <pinmux_config.h>/#include <common.h>/g' $tgt
	sed -i 's/#include "sequencer_auto.h"//g' $tgt
	sed -i 's/#include "sequencer_defines.h"//g' $tgt

	echo "	Automated readability fixup..."
	indent -npro -kr -i8 -ts8 -sob -l100 -ss -ncs -cp1 -il0 $tgt
	sed -i 's/ $//g' $tgt
}

generate_spl() {
	USE_SOCEDS_PYTHON=1 SOCEDS_DESTROY_PATH=1 \
		${embeddedsw}/embedded/embedded_command_shell.sh python \
		${embeddedsw}/embedded/ip/altera/preloader/scripts/iswgen.py \
		-i ${handoff} -o ${splroot}/
}

if [ -z $splroot ] || [ -z $boardroot ] || [ -z $handoff ]; then
	usage
fi

if [ $generate ]; then
	generate_spl
fi

copy_source ${splroot}/iocsr_config_cyclone5.c ${boardroot}/iocsr_config_cyclone5.c
copy_source ${splroot}/pinmux_config_cyclone5.c ${boardroot}/pinmux_config.c
copy_source ${splroot}/pll_config.h ${boardroot}/pll_config.h
copy_source ${splroot}/sdram/sdram_config.h ${boardroot}/sdram_config.h

copy_source ${handoff}/sequencer_auto.h ${boardroot}/sequencer_auto.h
copy_source ${handoff}/sequencer_auto_ac_init.c ${boardroot}/sequencer_auto_ac_init.c
copy_source ${handoff}/sequencer_auto_inst_init.c ${boardroot}/sequencer_auto_inst_init.c
copy_source ${handoff}/sequencer_defines.h ${boardroot}/sequencer_defines.h

if [ $generate ]; then
	rm -r ${splroot}
fi

echo "DONE"
